const { deviceCollection } = require('../../common/constants');
const { ERROR } = require('../../common/error');

async function setOpendbDevice({ pushClientId } = {}) {
    // 仅新增，如果存在进行更新操作
    const {
        appId,
        deviceId,
        deviceBrand,
        deviceModel,
        osName,
        osVersion,
        osLanguage,
        osTheme,
        devicePixelRatio,
        windowWidth,
        windowHeight,
        screenWidth,
        screenHeight,
        romName,
        romVersion,
    } = this.getUniversalClientInfo();
    const platform = this.clientPlatform;
    const now = Date.now();

    const db = uniCloud.database();
    const opendbDeviceCollection = db.collection('opendb-device');
    const getDeviceRes = await opendbDeviceCollection
        .where({
            device_id: deviceId,
        })
        .get();
    const data = {
        appid: appId,
        device_id: deviceId,
        vendor: deviceBrand,
        model: deviceModel,
        uni_platform: platform,
        os_name: osName,
        os_version: osVersion,
        os_language: osLanguage,
        os_theme: osTheme,
        pixel_ratio: devicePixelRatio,
        window_width: windowWidth,
        window_height: windowHeight,
        screen_width: screenWidth,
        screen_height: screenHeight,
        rom_name: romName,
        rom_version: romVersion,
        last_update_date: now,
        push_clientid: pushClientId,
    };
    if (getDeviceRes.data.length > 0) {
        await opendbDeviceCollection
            .where({
                device_id: deviceId,
            })
            .update(data);
        return;
    }
    data.create_date = now;
    await opendbDeviceCollection.add(data);
}

/**
 * 更新device表的push_clien_id
 * @tutorial https://uniapp.dcloud.net.cn/uniCloud/uni-id-pages.html#set-push-cid
 * @param {object} params
 * @param {string} params.pushClientId  客户端pushClientId
 * @returns
 */
module.exports = async function (params = {}) {
    const schema = {
        pushClientId: 'string',
    };
    this.middleware.validate(params, schema);
    const { deviceId, appId, osName } = this.getUniversalClientInfo();
    let platform = this.clientPlatform;
    if (platform === 'app') {
        platform += osName;
    }

    const { uid, exp } = this.authInfo;
    const { pushClientId } = params;
    const tokenExpired = exp * 1000;
    const getDeviceRes = await deviceCollection
        .where({
            device_id: deviceId,
        })
        .get();
    if (getDeviceRes.data.length > 1) {
        return {
            errCode: ERROR.SYSTEM_ERROR,
        };
    }
    const deviceRecord = getDeviceRes.data[0];
    await setOpendbDevice.call(this, {
        pushClientId,
    });
    if (!deviceRecord) {
        await deviceCollection.add({
            user_id: uid,
            device_id: deviceId,
            token_expired: tokenExpired,
            push_clientid: pushClientId,
            appid: appId,
        });
        return {
            errCode: 0,
        };
    }
    // 同一用户允许更新token_expired，不同用户在token_expired小于Date.now()时允许更新。搭配逻辑：用户退出登录时将token_expired置0
    if (deviceRecord.user_id === uid || deviceRecord.token_expired < Date.now()) {
        await deviceCollection
            .where({
                device_id: deviceId,
            })
            .update({
                user_id: uid,
                token_expired: tokenExpired,
                push_clientid: pushClientId,
                appid: appId,
            });
        return {
            errCode: 0,
        };
    }

    return {
        errCode: ERROR.SYSTEM_ERROR,
    };
};
